/*
	FreeRTOS.org V4.2.1 - Copyright (C) 2003-2007 Richard Barry.

	This file is part of the FreeRTOS.org distribution.

	FreeRTOS.org is free software; you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation; either version 2 of the License, or
	(at your option) any later version.

	FreeRTOS.org is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.

	You should have received a copy of the GNU General Public License
	along with FreeRTOS.org; if not, write to the Free Software
	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

	A special exception to the GPL can be applied should you wish to distribute
	a combined work that includes FreeRTOS.org, without being obliged to provide
	the source code for any proprietary components.  See the licensing section
	of http://www.FreeRTOS.org for full details of how and when the exception
	can be applied.

	***************************************************************************
	See http://www.FreeRTOS.org for documentation, latest information, license
	and contact details.  Please ensure to read the configuration and relevant
	port sections of the online documentation.

	Also see http://www.SafeRTOS.com for an IEC 61508 compliant version along
	with commercial development and support options.
	***************************************************************************
*/

/*
	- DESCRIPTOR DEFINITIONS -
*/

/* String descriptors used during the enumeration process.
These take the form:

{
	Length of descriptor,
	Descriptor type,
	Data
}
*/

const portCHAR pxLanguageStringDescriptor[] = {
  4,
  usbDESCRIPTOR_TYPE_STRING,
  0x09, 0x04
};

const portCHAR pxManufacturerStringDescriptor[] = {
  28,
  usbDESCRIPTOR_TYPE_STRING,

  'b', 0x00, 'i', 0x00, 't', 0x00, 'm', 0x00,
  'a', 0x00, 'n', 0x00, 'u', 0x00, 'f', 0x00,
  'a', 0x00, 'k', 0x00, 't', 0x00, 'u', 0x00,
  'r', 0x00
};

const portCHAR pxProductStringDescriptor[] = {
  40,
  usbDESCRIPTOR_TYPE_STRING,

  'O', 0x00, 'p', 0x00, 'e', 0x00, 'n', 0x00,
  'B', 0x00, 'o', 0x00, 'u', 0x00, 'n', 0x00,
  'c', 0x00, 'e', 0x00, 'r', 0x00, ' ', 0x00,
  'L', 0x00, 'o', 0x00, 'c', 0x00, 'k', 0x00,
  ' ', 0x00, 'v', 0x00, '0', 0x00, '1', 0x00,
  0x00, 0x00
};

const char pxConfigDescriptor[] = {

  /* Configuration 1 descriptor
     Here we define two interfaces (0 and 1) and a total of 3 endpoints.
     Interface 0 is a CDC Abstract Control Model interface with one interrupt-in endpoint.
     Interface 1 is a CDC Data Interface class, with a bulk-in and bulk-out endpoint.
     Endpoint 0 gets used as the CDC management element.
   */
  0x09,				/* CbLength                    	           */
  0x02,				/* CbDescriptorType                        */
  0x43, 0x00,			/* CwTotalLength 2 EP + Control            */
  0x02,				/* CbNumInterfaces                         */
  0x01,				/* CbConfigurationValue                    */
  0x00,				/* CiConfiguration                         */
  usbBUS_POWERED,		/* CbmAttributes Bus powered + Remote Wakeup */
  0x32,				/* CMaxPower: 100mA                        */

  /* Communication Class Interface Descriptor Requirement                  */
  0x09,				/* bLength                                 */
  0x04,				/* bDescriptorType                         */
  0x00,				/* bInterfaceNumber                        */
  0x00,				/* bAlternateSetting                       */
  0x01,				/* bNumEndpoints                           */
  0x02,				/* bInterfaceClass: Comm Interface Class   */
  0x02,				/* bInterfaceSubclass: Abstract Control Model */
  0x01,				/* bInterfaceProtocol: V.25ter             */
  0x00,				/* iInterface                              */

  /* Header Functional Descriptor                                          */
  0x05,				/* bLength                                 */
  0x24,				/* bDescriptor type: CS_INTERFACE          */
  0x00,				/* bDescriptor subtype: Header Func Desc   */
  0x10, 0x01,			/* bcdCDC:1.1                              */

  /* ACM Functional Descriptor                                             */
  0x04,				/* bFunctionLength                         */
  0x24,				/* bDescriptor type: CS_INTERFACE          */
  0x02,				/* bDescriptor subtype: ACM Func Desc      */
  0x06,				/* bmCapabilities                          */

  /* Union Functional Descriptor                                           */
  0x05,				/* bFunctionLength                         */
  0x24,				/* bDescriptor type: CS_INTERFACE          */
  0x06,				/* bDescriptor subtype: Union Func Desc    */
  0x00,				/* bMasterInterface: CDC Interface         */
  0x01,				/* bSlaveInterface0: Data Class Interface  */

  /* CDC Control - Endpoint 3 descriptor
     This endpoint serves as a notification element.                       */
  0x07,				/* bLength                                 */
  0x05,				/* bDescriptorType                         */
  0x83,				/* bEndpointAddress, Endpoint 03 - IN      */
  0x03,				/* bmAttributes   INT                      */
  0x08, 0x00,			/* wMaxPacketSize: 8 bytes                 */
  0xFF,				/* bInterval                               */

  /* Data Class Interface Descriptor Requirement                           */
  0x09,				/* bLength                                 */
  0x04,				/* bDescriptorType                         */
  0x01,				/* bInterfaceNumber                        */
  0x00,				/* bAlternateSetting                       */
  0x02,				/* bNumEndPoints                           */
  0x0A,				/* bInterfaceClass                         */
  0x00,				/* bInterfaceSubclass                      */
  0x00,				/* bInterfaceProtocol                      */
  0x00,				/* iInterface                              */

  /* CDC Data - Endpoint 1 descriptor */
  0x07,				/* bLenght                                 */
  0x05,				/* bDescriptorType                         */
  0x01,				/* bEndPointAddress, Endpoint 01 - OUT     */
  0x02,				/* bmAttributes BULK                       */
  64,				/* wMaxPacketSize                          */
  0x00,
  0x00,				/* bInterval                               */

  /* CDC Data - Endpoint 2 descriptor */
  0x07,				/* bLength                                 */
  0x05,				/* bDescriptorType                         */
  0x82,				/* bEndPointAddress, Endpoint 02 - IN      */
  0x02,				/* bmAttributes BULK                       */
  64,				/* wMaxPacketSize                          */
  0x00,
  0x00				/* bInterval                               */
};

const char pxDeviceDescriptor[] = {
  /* Device descriptor */
  0x12,				/* bLength                      */
  0x01,				/* bDescriptorType              */
  0x10, 0x01,			/* bcdUSBL                      */
  0x02,				/* bDeviceClass:                */
  0x00,				/* bDeviceSubclass:             */
  0x00,				/* bDeviceProtocol:             */
  0x08,				/* bMaxPacketSize0              */
  0x66, 0x23,			/* idVendorL                    */
  0x04, 0x00,			/* idProductL                   */
  0x00, 0x00,			/* bcdDeviceL                   */
  usbMANUFACTURER_STRING,	/* iManufacturer                */
  usbPRODUCT_STRING,		/* iProduct                     */
  0x00,				/* SerialNumber                 */
  0x01				/* bNumConfigs                  */
};
